from flask import current_app
from flask import g, jsonify
from flask import redirect
from flask import render_template
from flask import request
from flask import session
from flask import url_for

from info import constants
from info import user_login_data, db
from info.models import News, Category
from info.response_code import RET
from . import profile_blu
from info.utils.common import file_storage


@profile_blu.route('/info')
@user_login_data
def user_info():
    ''' 后台个人中心'''
    # 获取当前登陆用户的信息
    user = g.user

    return render_template('news/user.html',
                           user=user
                           )


@profile_blu.route("/user_base_info", methods=["POST", "GET"])
@user_login_data
def user_base_info():
    """修改个人基本信息"""
    # 获取当前登陆用户的信息
    user = g.user
    if request.method == "GET":

        return render_template("news/user_base_info.html",
                               user=user)
    else:
        """post提交数据"""
        # 获取json数据
        data_dict = request.json
        signature = data_dict.get('signature')
        nick_name = data_dict.get('nick_name')
        gender = data_dict.get('gender')

        # 校验数据
        if not all([nick_name, signature, gender]):
            return jsonify(errno=RET.PARAMERR, errmsg='参数有误')
        if gender not in (['MAN', 'WOMAN']):
            return jsonify(errno=RET.PARAMERR, errmsg="参数有误")

        # 3. 保存更改的数据
        user.nick_name = nick_name
        user.gender = gender
        user.signature = signature
        try:
            db.session.commit()
        except Exception as e:
            current_app.logger.error(e)
            db.session.rollback()
            return jsonify(errno=RET.DBERR, errmsg="保存数据失败")
        # 将session中保存的数据进行事实更新
        session['nick_name'] = nick_name

        # 4 返回操作结果
        return jsonify(errno=RET.OK, errmsg="更新成功")


@profile_blu.route("/user_pic_info", methods=["POST", "GET"])
@user_login_data
def user_pic_info():
    """修改用户头像"""
    # 获取当前登陆用户的信息
    user = g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg="用户未登录")

    if request.method == "GET":
        return render_template("news/user_pic_info.html",
                               user=user)
    else:
        """POST就要接受上传过来的而文件，并把上传的文件提交到七牛云"""
        # 1. 上传过来的头像文件[文件的内容需要通过read方法读取出来]
        avatar = request.files.get("avatar").read()

        # 把上传文件的内容上传到七牛云
        try:
            # 上传文件名
            avatar_file_name = file_storage(avatar)
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.THIRDERR, errmsg="上传图片错误")
        # 拼接完整的头像地址
        user.avatar_url = constants.QINIU_DOMIN_PREFIX + avatar_file_name
        try:
            db.session.commit()
        except Exception as e:
            current_app.logger.error(e)
            db.session.rollback()
            return jsonify(errno=RET.DBERR, errmsg="保存用户数据错误")

        # 4. 返回上传的结果<avatar_url>
        return jsonify(errno=RET.OK, errmsg="OK", data={"avatar_url": user.avatar_url})


# 测试视图函数
@profile_blu.route("/test_avatar")
def avatar():
    src = open("/home/python/Desktop/dog.png","rb")
    avatar = src.read()
    info = file_storage(avatar)
    print(info)
    return jsonify(errno=RET.OK, errmsg="上传图片成功")


# ----------- 用户修改密码功能--------------
@profile_blu.route('/user_pass_info', methods=['GET', 'POST'])
@user_login_data
def user_pass_info():
    '''用户修改密码'''
    user = g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg="用户未登录")

    if request.method == 'GET':
        return render_template("news/user_pass_info.html")

    else:
        '''post发送数据，修改密码'''
        # 1.接收旧密码，新密码，确认密码
        data_dict = request.json
        old_password = data_dict.get('old_password')
        new_password = data_dict.get('new_password')
        new_password2 = data_dict.get('new_password2')

        # 2.校验参数
        if not all([old_password, new_password, new_password2]):
            return jsonify(errno=RET.PARAMERR, errmsg="参数有误")

        if new_password != new_password2:
            return jsonify(errno=RET.PARAMERR, errmsg="新密码和确认密码不一致")

        # 2.1 判断旧密码和数据库的密码是否一致
        if not user.check_passowrd(old_password):
            return jsonify(errno=RET.PWDERR, errmsg='原密码错误')

        # 3.更新密码【新密码要加密】
        user.password = new_password

        # 3.1 保存密码
        try:
            db.session.commit()
        except Exception as e:
            current_app.logger.errpr(e)
            db.session.rollback()
            return jsonify(errno=RET.DBERR, errmsg='数据保存失败')

        # 4. 返回结果
        return jsonify(errno=RET.OK, errmsg='密码保存成功')

    # ----------------显示用户发布的新闻列表-----------------


@profile_blu.route('/user_news_list', methods=['GET'])
@user_login_data
def user_news_list():

    # 根据当前用户的id查询对应发布的新闻
    user = g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg="用户未登录")

    page = int(request.args.get('p', 1))  # 当前页码
    # 第一页的数据量
    per_page = int(request.args.get('per_page', 1))  # 当前页码

    # 返回总页码
    total_page = 1
    try:
        pagination = News.query.filter(News.user_id == user.id)\
        .order_by(News.id.desc())\
        .paginate(page, per_page, False)
        # 获取总页数
        total_page = pagination.pages

    except Exception as e:
        current_app.logger.error(e)

    """用户发布的新闻列表页面"""
    return render_template('news/user_news_list.html', total_page=total_page)


@profile_blu.route("/user_get_news_list", methods=["GET"])
@user_login_data
def user_get_news_list():
    """ajax提供数据分页"""
    # 根据当前用户的id查询对应的发布新闻
    user = g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg="用户未登录")

    # 接收参数[默认页码，每一页数据量]
    # 从地址烂上面获取的数据，统一都是字符串，我们要进行分页，页码和每一页数据量必须是int类型
    page = int(request.args.get("p", 1))  # 当前页码

    # 每一页数据量
    per_page = int(request.args.get("per_page", constants.OTHER_NEWS_PAGE_MAX_COUNT))

    # 进行分页
    try:
        pagination = News.query.filter(News.user_id == user.id) \
            .order_by(News.id.desc()) \
            .paginate(page, per_page, False)

        # 获取当前页数据[是一个列表，列表中的成员是每一个数据模型对象]
        news_li = pagination.items

        # 获取当前页
        page = pagination.page

        # 获取总页数
        total_page = pagination.pages

    except Exception as e:
        current_app.logger.error(e)
        # 可以选择不报错，只记录信息

    # 对分页数据从模型对象转换为字典
    news_list = []
    total_page = 0
    for item in news_li:
        news_list.append(item.to_basic_dict())

    return jsonify(errno=RET.OK, errmsg='操作成功',
                   page=page,
                   total_page=total_page,
                   news_list=news_list)

# ------------用户发布新闻---------------


@profile_blu.route("/user_news_release", methods=["GET", "POST"])
@user_login_data
def user_news_release():
    """用户发布新闻"""
    user = g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg="用户未登录")
    if request.method == "GET":
        # 查询新闻分类
        try:
            categories = Category.query.filter(Category.name != '最新').all()
        except Exception as e:
            current_app.logger.error(e)
        return render_template('news/user_news_release.html',
                               categories=categories)

    else:
        '''POST提交数据'''
        # 获取参数，新闻标题，图片，新闻内容，分类ID，摘要。

        # 1. 后端接收参数[ 标题、分类id、摘要、内容、上传图片 ]
        data_dict = request.form  # 接收表单通过post提交数据

        title = data_dict.get('title')  # 新闻标题
        source = "个人发布"  # 新闻来源
        digest = data_dict.get("digest")  # 新闻摘要
        content = data_dict.get("content")  # 新闻内容
        index_image = request.files.get("index_image")  # 图片
        category_id = data_dict.get("category_id")

        # 2.校验
        if not all([title, source, digest, content, index_image, category_id]):
            return jsonify(errno=RET.PARAMERR, errmsg="参数有误")

        # 3.1 首先把文件上传到七牛云
        try:
            # 读取图片内容
            index_image = index_image.read()
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.PARAMERR, errmsg="参数有误")

        # 3.2 上传图片，获取图片地址
        try:
            index_image_filename = file_storage(index_image)
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.THIRDERR, errmsg="上传图片错误")

        news = News()
        news.title = title
        news.digest = digest
        news.source = source
        news.content = content
        news.index_image_url = constants.QINIU_DOMIN_PREFIX + index_image_filename
        news.category_id = category_id
        news.user_id = user.id
        # 1代表待审核状态 [用户发布的信息，不能直接信任，需要审核]
        news.status = 1
        # 4 响应数据
        try:
            db.session.add(news)
            db.session.commit()
        except Exception as e:
            current_app.logger.error(e)
            db.session.rollback()
            return jsonify(errno=RET.DBERR, errmsg="保存数据失败")

        # 5. 返回结果[因为是表单提交的数据，所以直接可以后端指定要跳转页面]
        return redirect(url_for("user.user_news_list"))














